home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / misc / emu / Apex-src.lha / SET.XPL < prev    next >
Text File  |  2001-09-30  |  7KB  |  303 lines

  1. \SET.XPL    DEC-08-88
  2. \Utility to set .SAV file parameters for Apex version 1.8.
  3.  
  4. \REVISION HISTORY:
  5. \NOV-08-85, Restricted buffers to page boundaries and cleaned up, L.B.
  6. \FEB-26-86, Modified for 68000 Apex, L.B.
  7. \SEP-OCT-86, Modified for new system page parameters.
  8. \NOV-18-86, Modified to handle large numbers
  9. \APR-11-87, Changed string conventions, hex-only input.
  10. \JUL-02-88, Changed buffer end address to end with $FF, disallow odd
  11. \ addresses, misc. clean up.
  12. \DEC-08-88, Fix tabs
  13.  
  14. code    REM=2,        RESERVE=3,    SWAP=4,        CHIN=7,
  15.     CHOUT=8,    CRLF=9,        TEXT=12,    OPENI=13,
  16.     READ=31,    WRITE=30,    ABORT=16,    HEXOUT=27;
  17.  
  18. \THE SYSTEM GLOBALS:
  19. int    UNIT,        \Unit number the .SAV file is on
  20.     FIRBLK,        \First block of .SAV file
  21.     CHAR,        \Input character
  22.     SPECIAL,    \Special bits in program file request
  23.     NEWSPEC,    \"BACK UP", "SIZE LIMIT", and "KEEP DATE" flag bits
  24.     INLBLK;        \Low block number of .SAV file
  25. addr    PARM,        \System page parameters
  26.     SYSPAG;        \256-byte array to hold first block of the .SAV file
  27.  
  28. \ASCII CONSTANTS:
  29. def    CR= $0D, TAB= $09, BEL= $07;
  30.  
  31. \FILE STATUS IN SYSTEM PAGE:
  32. def    NOFILE= 0, SETUP= 1, CLOSED= 255;
  33.  
  34. \OFFSETS INTO THE SYSTEM PAGE:
  35. \ (See main for additional definitions)
  36. def    VSTART= $02,    \Jump vector addresses (+2 to skip JMP)
  37.     VRSTRT= $08,
  38.     VEXIT= $0E,
  39.     VERR= $14,
  40.     VABORT= $1A,
  41.  
  42.     DEXTO= $5B,    \Default extension for output file
  43.     DEXTI= $61,    \Default extension for input file
  44.     DEFAUL= $67,    \Special default flag byte
  45.     SYBOMB= $68,    \Flag: User program bombs system
  46.  
  47. \32-BIT PARAMETERS IN SYSPAG:
  48.     HEAP= $6E,    \Start of user heap space
  49.     STACK= $72,    \Start of user stack space
  50.     OTBUF= $86,
  51.     OTBUFE= $8A,
  52.     INBUF= $8E,
  53.     INBUFE= $92,
  54.  
  55.     INFLG= $16A,    \Input file status flag
  56.     INUNT= $16C;    \Device number input file is on
  57.  
  58. \----------------------------------------------------------------------
  59.  
  60. proc    ERROR(STR);    \Report error
  61. addr    STR;
  62. begin
  63. CHOUT(0, BEL);
  64. TEXT(0, "NOPE - ");   TEXT(0, STR);
  65. CRLF(0);
  66. end;    \ERROR
  67.  
  68. \----------------------------------------------------------------------
  69.  
  70. proc    NEXT;        \Get next character and convert to uppercase
  71. begin
  72. CHAR:= CHIN(0);
  73. if CHAR>=^a & CHAR<=^z then CHAR:= CHAR & $DF;
  74. end;    \NEXT
  75.  
  76. \----------------------------------------------------------------------
  77.  
  78. func    PEEK32(ADDR);    \Returns the 32-bit value at the given address
  79. int    ADDR;
  80. return ADDR(0);
  81.  
  82.  
  83.  
  84. proc    POKE32(ADDR, VALUE);    \Store the 32-bit value at the given address
  85. int    ADDR, VALUE;
  86. ADDR(0):= VALUE;
  87.  
  88. \----------------------------------------------------------------------
  89.  
  90. func    GETHEX;        \Input a hex number from the operator
  91. int    I, ADD;        \First digit is already read in
  92.  
  93.  
  94.     func    NUMERIC;
  95.     int    DUMMY;
  96.     return CHAR>=^0 & CHAR<=^9;
  97.  
  98.  
  99.     func    HEX;
  100.     int    DUMMY;
  101.     return NUMERIC ! (CHAR>=^A & CHAR<=^Z);
  102.  
  103.  
  104. begin
  105. while not HEX do NEXT;
  106. I:= 0;
  107. while HEX do
  108.     begin
  109.     if CHAR < ^A then ADD:= CHAR -^0
  110.     else ADD:= CHAR -^A +10;
  111.     I:= I <<4 + ADD;
  112.     NEXT;
  113.     end;
  114. return I;
  115. end;    \GETHEX
  116.  
  117. \----------------------------------------------------------------------
  118.  
  119. proc    GETADDR(OFF);    \Show and optionally get an address
  120. int    OFF;        \Offset into SYSPAG
  121. int    I;
  122. begin
  123. CHOUT(0, ^$);   HEXOUT(0, PEEK32(SYSPAG+OFF));
  124. TEXT(0, " $");
  125. OPENI(0);
  126. NEXT;
  127. if CHAR # CR then 
  128.     begin
  129.     loop    begin
  130.         I:= GETHEX;
  131.         if (I&$01)=0 then quit;
  132.         ERROR("MUST BE AN EVEN ADDRESS");
  133.         end;
  134.     POKE32(SYSPAG+OFF, I);
  135.     end;
  136. end;    \GETADDR
  137.  
  138. \----------------------------------------------------------------------
  139.  
  140. proc    SHOWBOOL(TXT, FLAG);    \Show message and boolean value (T/F)
  141. addr    TXT;
  142. int    FLAG;
  143. begin
  144. TEXT(0, TXT);
  145. CHOUT(0, TAB);
  146. if FLAG then CHOUT(0, ^T) else CHOUT(0, ^F);
  147. CHOUT(0, ^ );
  148. end;    \SHOWBOOL
  149.  
  150. \----------------------------------------------------------------------
  151.  
  152. proc    GETEXT(DFEXT);    \Show and optionally get default extension for file
  153. int    DFEXT;
  154. int    I;
  155. begin
  156. for I:= 0, 2 do CHOUT(0, SYSPAG(DFEXT +I));
  157. OPENI(0);
  158. TEXT(0, " ");
  159. NEXT;
  160. if CHAR # CR then
  161.     begin
  162.     for I:= 0, 2 do
  163.         begin
  164.         if CHAR>=$20 & CHAR#^. then
  165.             SYSPAG(DFEXT+I):= CHAR
  166.         else    I:= I-1;
  167.         NEXT;
  168.         end;
  169.     end;
  170. end;    \GETEXT
  171.  
  172. \----------------------------------------------------------------------
  173.  
  174. proc    GETBUF(START, END);
  175. \Show and optionally get the starting and ending buffer addresses
  176. int    START, END;
  177. int    I;
  178. begin
  179. CHOUT(0, ^$);   HEXOUT(0, PEEK32(SYSPAG+START));
  180. CHOUT(0, ^-);
  181. CHOUT(0, ^$);   HEXOUT(0, PEEK32(SYSPAG+END)-1);
  182. TEXT(0, " $");
  183. OPENI(0);
  184. NEXT;
  185. if CHAR # CR then
  186.     begin                \Get new number from operator
  187.     loop    begin
  188.         I:= GETHEX;
  189.         if (I&$FF)=0 then quit;
  190.         ERROR("MUST START ON PAGE BOUNDARY");
  191.         end;
  192.     POKE32(SYSPAG+START, I);
  193.  
  194.     loop    begin
  195.         I:= GETHEX;
  196.         if (I&$FF)=$FF then quit;
  197.         ERROR("MUST END ON PAGE BOUNDARY");
  198.         end;
  199.     POKE32(SYSPAG+END, I+1);
  200.     end;
  201. end;    \GETBUF
  202.  
  203. \----------------------------------------------------------------------
  204.  
  205. begin    \MAIN
  206. SYSPAG:= RESERVE(256);
  207.  
  208. TEXT(0, "-- SET, V1.8x4 --
  209.  
  210. ");
  211. PARM:= $0400;                \Location of resident system page
  212. INLBLK:= $562;
  213.  
  214. if PARM(INFLG) # SETUP then [ERROR("NEED .SAV FILE");   ABORT];
  215. UNIT:= PARM(INUNT);            \Get the input file unit number
  216. FIRBLK:= INLBLK(0);            \Get input file's starting block no.
  217. READ(UNIT, FIRBLK, SYSPAG, 1);        \Read in SYSPAG
  218.  
  219. repeat    begin
  220.     TEXT(0, "START:        ");
  221.     GETADDR(VSTART);
  222.  
  223.     TEXT(0, "RESTART:    ");
  224.     GETADDR(VRSTRT);
  225.  
  226.     TEXT(0, "EXIT:        ");
  227.     GETADDR(VEXIT);
  228.  
  229.     TEXT(0, "ERROR EXIT:    ");
  230.     GETADDR(VERR);
  231.  
  232.     TEXT(0, "ABORT EXIT:    ");
  233.     GETADDR(VABORT);
  234.  
  235.     TEXT(0, "HEAP:        ");
  236.     GETADDR(HEAP);
  237.  
  238.     TEXT(0, "STACK:        ");
  239.     GETADDR(STACK);
  240.  
  241.     CRLF(0);
  242.  
  243.     TEXT(0, "DEFAULT OUTPUT EXTENSION: ");
  244.     GETEXT(DEXTO);
  245.  
  246.     TEXT(0, "DEFAULT INPUT EXTENSION:  ");
  247.     GETEXT(DEXTI);
  248.  
  249.     CRLF(0);
  250.  
  251.     SHOWBOOL("SYSBOMB:", SYSPAG(SYBOMB));
  252.     OPENI(0);
  253.     NEXT;
  254.     SYSPAG(SYBOMB):= (if CHAR=^F then 0
  255.         else (if CHAR=^T then $FF else (SYSPAG(SYBOMB))));
  256.  
  257.     SPECIAL:= SYSPAG(DEFAUL);        \GET SYSTEM FLAGS
  258.  
  259.     SHOWBOOL("BACKUP:  ", SPECIAL&1);
  260.     OPENI(0);
  261.     NEXT;
  262.     NEWSPEC:= (if CHAR=^F then 0
  263.         else (if CHAR=^T then 1 else (SPECIAL&1)));
  264.  
  265.     SHOWBOOL("SIZE LIMIT:", SPECIAL&2);
  266.     OPENI(0);
  267.     NEXT;
  268.     NEWSPEC:= NEWSPEC ! (if CHAR=^F then 0
  269.         else (if CHAR=^T then 2 else (SPECIAL&2)));
  270.  
  271.     SHOWBOOL("KEEP DATE:", SPECIAL&4);
  272.     OPENI(0);
  273.     NEXT;
  274.     NEWSPEC:= NEWSPEC ! (if CHAR=^F then 0
  275.         else (if CHAR=^T then 4 else (SPECIAL&4)));
  276.  
  277.     SYSPAG(DEFAUL):= NEWSPEC;
  278.     CRLF(0);
  279.  
  280.     TEXT(0, "OUTPUT BUFFER: ");
  281.     GETBUF(OTBUF, OTBUFE);
  282.  
  283.     TEXT(0, "INPUT BUFFER:  ");
  284.     GETBUF(INBUF, INBUFE);
  285.  
  286.     CRLF(0);
  287.     TEXT(0, "SATISFIED (N/Y)? ");
  288.     OPENI(0);
  289.     NEXT;
  290.     CRLF(0);
  291.     end;
  292. until (CHAR!$20) = ^y;
  293.  
  294. WRITE(UNIT, FIRBLK, SYSPAG, 1);
  295. end;    \MAIN
  296. SFIED (N/Y)? ");
  297.     OPENI(0);
  298.     NEXT;
  299.     CRLF(0);
  300.     end;
  301. until (CHAR!$20) = ^y;
  302.  
  303. WRITE(UNIT, FIRBLK, SYSPAG, 1